package com.third.device.mg.serialport.factory.jiecang

import com.third.device.mg.serialport.utils.to2ByteL
import com.third.device.mg.serialport.utils.toIntU

/**
 * @Date 2022/2/21
 * Description:
 * 波特率——9600
 * 数据位——8位
 * 停止位——1位
 * 奇偶校验——无
 *
 * 3.1外部设备至控制器
 * 起始贞	功能码	数据长度	  数据	       校验和	   结束贞
 * 2字节	    1字节	XX	      XXXXXXXX	   1字节  	   1字节
 * 起始贞：F1F1
 * 功能码：根据实际情况定义
 * 数据长度：数据中的字节数
 * 数据：实际的操作内容
 * 校验和：除了起始贞和结束贞外，其余数据相加，取低8位；
 * 结束贞：7E
 *
 * 3.2控制器至外部设备
 * 起始贞	功能码	数据长度	  数据	       校验和	   结束贞
 * 2字节	    1字节	XX	      XXXXXXXX	   1字节  	   1字节
 * 起始贞：F2F2
 * 功能码：根据实际情况定义
 * 数据长度：数据中的字节数
 * 数据：实际的操作内容
 * 校验和：除了起始贞和结束贞外，其余数据相加，取低8位；
 * 结束贞：7E
 */
object JieCangCRC {


    /**
     * 校验发送的指令(旧指令，无适配器)
     */
    fun checkSent(msg:ByteArray):ByteArray{
        val result = ByteArray(msg.size + 4)
        var sum =  0
        msg.forEach {
            sum += it.toIntU()
        }
        result[0] = 0xF1.toByte()
        result[1] = 0xF1.toByte()
        System.arraycopy(msg , 0 ,result ,2 ,msg.size)
        result[result.size - 2] = sum.to2ByteL()[0] //校验和 取低8位；
        result[result.size - 1] = 0x7E //结束贞
        return result
    }


    /**
     * 厨电设备协议
     * 协议版本JC_1.0
     * 起始码开始到功能数据结束的所有数据求和取低字节
     *
     * 起始码	数据长度	    设备类型	    功能码	    功能数据	    校验和	    结束码
     * 2B	    1B	        1B	        1B	         nB	        1B	        1B
     * 2.1起始码  ：固定为55 AA
     * 2.2数据长度：从设备类型开始到功能数据的结束字节数（不包括校验）
     * 2.3设备类型：即数据源，比如该字节为01，说明数据来源于手控器，具体定义见表2.1,表中外设即各种接到控制器的设备，比如六轴传感器，各种智能模组转接盒等；主机收到什么类型就回复什么类型即可。
     * 2.4 功能码及功能数据，具体定义见表2.2
     * 2.5校验码
     * 从起始码开始到功能数据结束的所有数据求和取低字节
     * 2.6结束符AA
     *
     * @param msg 只有设备类型  功能码  功能数据 的 byteArray
     */
    fun checkKitchenAgreement(msg: ByteArray):ByteArray{
        val result = ByteArray(2 + 1 + msg.size + 1 + 1) //启始码2 数据长度1 (设备类型 功能码 功能数据) 校验和1 结束码1
        result[0] = 0x55
        result[1] = 0xAA.toByte()
        result[2] = msg.size.toByte()
        System.arraycopy(msg ,0 ,result ,3 ,msg.size)
        var sum =  0
        result.forEach {
            sum += it.toIntU()
        }
        val key = sum.to2ByteL()
        result[result.size - 2] = key[0]
        result[result.size - 1] = 0xAA.toByte()
        return result
    }
}